import requests
from bs4 import BeautifulSoup
import bs4
import pandas as pd

#
# url = 'https://www.shanghairanking.cn/rankings/bcur/202111'
# r = requests.get(url, timeout=30)
# r.raise_for_status()
# r.encoding = r.apparent_encoding
# print(r,text)
# 返回<class 'requests.models.Response'>
#
# requests.models.Response 类是 requests 库中用于表示 HTTP 响应的对象类型。它包含了与 HTTP 响应相关的各种信息和方法，使得你能够对响应进行处理和分析。
#
# 这个类的一些主要属性和方法包括：
#
# status_code：响应状态码，比如 200 表示请求成功，404 表示资源未找到等。
# headers：响应头信息，包括诸如 Content-Type、Content-Length 等头部字段。
# text：响应的文本内容。
# content：响应的二进制内容。
# json()：将响应内容解析为 JSON 格式。
# raise_for_status()：如果请求失败，则抛出异常。
# 这些属性和方法使得你能够方便地获取和处理 HTTP 响应，从而实现对网络资源的访问和操作。




def getGTMLText(url):
    """
    爬取目标网页的文本信息
    :param url:目标网页链接
    :return:目标网页的文本信息
    """
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding   #自动识别编码
        return r.text
    except:
        return ""


def fillUnivList(ulist, html):
    """
    通过BeautifulSoup库解析文本信息，并将所需信息存入ulist列表中
    :param ulist:大学信息列表， 排名 学校名称 得分
    :param html:爬取的文本信息
    :return:
    """
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.find('tbody').children:  # 遍历tbody的所有子孙节点
        if isinstance(tr, bs4.element.Tag):  # 判断tr标签的类型，如何不是bs4库定义的tag类型，过滤掉
            tds = tr('td')  # 等价于 tr.find_all('td') 将tbody中所有的td标签添加到列表tds
            univ = [tds[0].string.strip(),  # 提取对应标签中非属性字符串
                    tds[1].find('a').string.strip(),  # 大学名称存在td标签的子标签a中，
                    tds[4].string.strip()]
            ulist.append(univ)


def printUnivList(ulist, num):
    """
    打印大学排名信息
    :param ulist: 大学信息列表， 排名 学校名称 得分
    :param num: 爬取学校的数量
    :return:
    """
    # 打印格式  ^表示居中
    tlpt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
    print(tlpt.format("排名", "学校", "得分", chr(12288)))
    for i in range(num):
        u = ulist[i]
        print(tlpt.format(u[0], u[1], u[2], chr(12288)))



def main():
    uinfo = []  # uinfo == ulist  大学排名信息
    url = 'https://www.shanghairanking.cn/rankings/bcur/202111'
    html = getGTMLText(url)
    fillUnivList(uinfo, html)
    # printUnivList(uinfo, 30)  # univ
    # print("完成")
    df = pd.DataFrame(uinfo,columns=["排名","大学名称","评分"])
    df.to_excel('out.xlsx', index=False)
    print("完成")

if __name__ == '__main__':
    main()

